#ifndef __COMM_HPP__
#define __COMM_HPP__

#include<iostream>
#include"log.hpp"
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<error.h>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<cstring>

using namespace std;


const string pathname= "/home/xl";
const int proj_id=0X6666;
//共享内存的大小一般建议是4096的整数倍
//如果capacity 给4097，实际上操作系统给你的是4096*2的大小
const int capacity =4096;
Log log;

pid_t GetKey()
{
    int k=ftok(pathname.c_str(), proj_id);
    if(k<0)
    {
        log(Fatal,"ftok error: %s" ,strerror(errno));
        exit(1);
    }
    log(Info,"ftok sucess, key: 0x%x" ,k);
    return k;
}

int GetShareMemHelper(int flag)  //flag含打开方式，权限等
{
    pid_t k=GetKey();
    int shmid=shmget(k, capacity, flag);  //0666为共享内存的权限
    if(shmid<0)
    {
        log(Fatal,"shmget error: %s" ,strerror(errno));
        exit(2);
    }
    log(Info,"shmget sucess,shmid: %d" ,shmid);
    return shmid;
}

//创建共享内存
int CreateShm()
{
    return GetShareMemHelper(IPC_CREAT|IPC_EXCL|0666);
}

//获取共享内存
int GetShm()
{
    return GetShareMemHelper(IPC_CREAT);    //IPC_CREAT：不存在则创建，存在则返回存在的共享标识符
}


//命名管道，使用命名管道，让共享内存空间实现：写一句读一句
#define FIFO_FILE "./myfifo"  // 管道文件的名字和路径
#define MODE 0664
#define MAX 1024

enum
{
    FIFO_CREATE_ERR = 1,
    FIFO_DELETE_ERR,
    FIFO_OPEN_ERR
};

//创建管道+删除管道
class Init
{
public:
    Init()
    {
        // 创建文件
        int n = mkfifo(FIFO_FILE, MODE);
        if (n < 0)
        {
            perror("mkfifo");
            exit(FIFO_OPEN_ERR);
        }
    }
    ~Init()
    {
        // 删除管道文件
        int m = unlink(FIFO_FILE);
        if (m == -1)
        {
            perror("unlink");
            exit(FIFO_DELETE_ERR);
        }
    }
};

#endif 
